package cn.vshare.Realm;

import org.apache.log4j.Logger;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResourceCheckFilter  extends AccessControlFilter {

    private static final Logger logger=Logger.getLogger(ResourceCheckFilter.class);

    private String errorUrl;



    //可以不重写
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        return super.onAccessDenied(request, response, mappedValue);
    }

    /**
     *表示是否允许访问 ，如果允许访问返回true，否则false；
     * @param servletRequest
     * @param servletResponse
     * @param o 表示写在拦截器中括号里面的字符串 mappedValue 就是 [urls] 配置中拦截器参数部分
     * @return
     * @throws Exception
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        Subject subject=getSubject(servletRequest,servletResponse);


        //得到访问的URl,实质是@RequestMapping(value = "/toIndex")的value值,
        // 同时也是spring-shiro.xml的<property name="filterChainDefinitions">的
        // 节点<value>的/toIndex.do=resourceCheckFilter111,perms[/toIndex.do]的等号左边/xxx.do
        String url=getPathWithinApplication(servletRequest);


        logger.debug("当前用户正在访问的URL是===>"+url);
        boolean flag=subject.isPermitted(url);//进行URL验证,使用Resovler解析器(在ini中配置)
        return flag;
    }

    /**
     *onAccessDenied：表示当访问拒绝时是否已经处理了；
     * 如果返回 true 表示需要继续处理；
     * 如果返回 false 表示该拦截器实例已经处理了，将直接返回即可。
     * @param servletRequest
     * @param servletResponse
     * @return
     * @throws Exception
     */
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {

        /*20181010wyl--start*/
        /*
         * 目的是在被访问拒绝的时候得知现在访问的是哪一个URL,从而做出不同的反应,跳转到不同的业务逻辑
         *
         * */
        Subject subject=getSubject(servletRequest,servletResponse);
        //得到访问的URl,实质是@RequestMapping(value = "/toIndex")的value值,
        // 同时也是spring-shiro.xml的<property name="filterChainDefinitions">的
        // 节点<value>的/toIndex.do=resourceCheckFilter111,perms[/toIndex.do]的等号左边/xxx.do
        String url=getPathWithinApplication(servletRequest);
        logger.debug("111当前用户正在访问的未被授权的URL是===>"+url);
        /*20181010wyl--end*/


        /*20181010wyl*/
        /*
        * 针对当前访问的但未授权的操作进行不同的逻辑处理
        * <!--与spring-shiro.xml:20的功能等同,,相辅相成-->
        * */

        /*20181023wyl
        *前台页面
        * 只针对 打赏,收藏,评论,发送弹幕这四个功能进行 判断
        * 如果未登录状态,则进行该操作的过滤器验证,
        * 登录后才可以使用这四个权限
        *
        * */
        if (("/getBarrageList.do").equals(url)){
            //弹幕的发送
            this.errorUrl="/need2Login.do";
        }else if (("/rewardToUser.do").equals(url)){
            //打赏功能
            this.errorUrl="/need2Login.do";
        }else if (("/addFavorite.do").equals(url)){
            //收藏该视频功能
            this.errorUrl="/need2Login.do";
        }else if (("/queryIsFavoriter.do").equals(url)){
            //查询该视频的收藏状态标识
            this.errorUrl="/need2Login.do";
        }

        /*
        * 20181016评论和回复功能
        * */
        else if (("/addComment.do").equals(url)){
            //新增评论功能
            this.errorUrl="/need2Login.do";
        }else if (("/addReply.do").equals(url)){
            //新增回复功能
            this.errorUrl="/need2Login.do";
        }else if (("/updateCommentAddLike.do").equals(url)){
            //新增回复功能
            this.errorUrl="/need2Login.do";
        }else if (("/updateCommentCancelLike.do").equals(url)){
            //新增回复功能
            this.errorUrl="/need2Login.do";
        }else if (("/updateReplyAddLike.do").equals(url)){
            //新增回复功能
            this.errorUrl="/need2Login.do";
        }else if (("/updateReplyCancelLike.do").equals(url)){
            //新增回复功能
            this.errorUrl="/need2Login.do";
        }
        /////////////////////后台过滤器//////////////////////
        /*
        * 后台页面
        * 只针对 登录首页(管理员身份),角色,权限这三个方面进行 判断,进行该操作的过滤器验证,
         * 如果不具有某项权限时,提示无法操作,不具备该权限,
         * 需要超级管理员进行授权后方可操作
        * */
        else if (("/toAdminFtl.do").equals(url)){
            //后台身份的拦截验证,只有管理员才可以进入后台主页面
            this.errorUrl="/toFail.do";
         /////////////////////角色//////////////////////
        } else if (("/delete2Array2Role.do").equals(url)){
            //批量删除角色及权限信息
            this.errorUrl="/need2GetPermission.do";
        }else if (("/toAdmin_role_add.do").equals(url)){
            //新增角色及权限
            this.errorUrl="/need2GetPermission.do";
        }else if (("/addRole.do").equals(url)){
            //新增角色及权限
            this.errorUrl="/need2GetPermission.do";
        }else if (("/getRoleById.do").equals(url)){
            //遮罩层打开,角色信息编辑页面
            //编辑角色信息及权限信息更新
            this.errorUrl="/need2GetPermission.do";
        }else if (("/deleteRole.do").equals(url)){
            //删除该角色
            this.errorUrl="/need2GetPermission.do";
        }
        /////////////////////一级权限//////////////////////
        else if (("/delete2Array2PermissionFirst.do").equals(url)){
            //批量删除权限信息
            this.errorUrl="/need2GetPermission.do";
        }else if (("/toAdmin_permission_first_add.do").equals(url)){
            //新增权限
            this.errorUrl="/need2GetPermission.do";
        }else if (("/addPermissionFirst.do").equals(url)){
            //新增权限
            this.errorUrl="/need2GetPermission.do";
        }else if (("/getPermissionFirstById.do").equals(url)){
            //遮罩层打开,权限信息更新
            this.errorUrl="/need2GetPermission.do";
        }else if (("/deletePermissionFirst.do").equals(url)){
            //删除该权限
            this.errorUrl="/need2GetPermission.do";
        }
        /////////////////////二级权限//////////////////////
        else if (("/delete2Array2PermissionSecond.do").equals(url)){
            //批量删除权限信息
            this.errorUrl="/need2GetPermission.do";
        }else if (("/toAdmin_permission_second_add.do").equals(url)){
            //新增权限
            this.errorUrl="/need2GetPermission.do";
        }else if (("/addPermissionSecond.do").equals(url)){
            //新增权限
            this.errorUrl="/need2GetPermission.do";
        }else if (("/getPermissionSecondById.do").equals(url)){
            //遮罩层打开,权限信息更新
            this.errorUrl="/need2GetPermission.do";
        }else if (("/deletePermissionSecond.do").equals(url)){
            //删除该权限
            this.errorUrl="/need2GetPermission.do";
        }
        //////////////////////////////////////////////
        else {
            //默认不具备某项授权时,提示进行登录
            //this.errorUrl="/login.html";
            this.errorUrl="/toFail.do";
        }


        logger.debug("1111当 isAccessAllowed 返回 false 的时候，才会执行 method onAccessDenied,将要跳转的逻辑是:   "+this.errorUrl);

        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpServletResponse response= (HttpServletResponse) servletResponse;
        //response.sendRedirect(request.getContextPath()+this.errorUrl);
        request.getRequestDispatcher(this.errorUrl).forward(request,response);


        // 返回 false 表示已经处理，例如页面跳转啥的，表示不在走以下的拦截器了（如果还有配置的话）
        return false;
    }



    public String getErrorUrl() {
        return errorUrl;
    }

    public void setErrorUrl(String errorUrl) {
        this.errorUrl = errorUrl;
    }
}
